package java6699.regex;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;
/**
 * 字符串sort6699
 *
 * @author 周梓希
 * @date 2022/09/05
 */
public class CheckRegex6699 extends Application {
    /**
     * 主要
     * 调用Application的launch启动javaFX程序
     * @param args
     */
    public static void main(String[] args) {
        launch(args);
    }
    /**
     * 开始
     * 重写start方法
     *
     * @param primaryStage 初级阶段
     * @throws Exception 异常
     */
    @Override
    public void start(Stage primaryStage) throws Exception {
        //利用getRoot放回的根节点创建Scene,并指定
        Scene scene = new Scene(getRoot());
        primaryStage.setScene(scene);
        primaryStage.setTitle("验证正则表达式");
        primaryStage.show();
    }

    /**
     * 得到根
     *
     * @return {@link Parent}
     */
    private Parent getRoot() {
        //显示每个人的学号和姓名
        Label lblStudent = new Label("212106699周梓希");
        BorderStroke bs = new BorderStroke(Paint.valueOf("#8FBC8F"),//边框的颜色
                BorderStrokeStyle.DOTTED,//边框的样式
                new CornerRadii(10),//边框四个角的圆角
                new BorderWidths(3));//边框的宽度
        lblStudent.setBorder(new Border(bs));//设置边框
        lblStudent.setPadding(new Insets(10));//设置边距

        //输入正则表达式的两个控件用水平排列
        HBox hRegex = new HBox(10);
        Label lblRegex = new Label("正则表达式：");
        TextField tfRegex = new TextField();
        hRegex.getChildren().addAll(lblRegex, tfRegex);//添加两个控件
        hRegex.setAlignment(Pos.CENTER_LEFT);//垂直居中，水平靠左
        HBox.setHgrow(tfRegex, Priority.ALWAYS);//文本框的宽度填满剩余空间

        Label lblInput = new Label("输入要检验的一组字符串（用逗号分隔）");
        //多行文本框，输入一组要验证的字符串
        TextArea taInput = new TextArea();
        taInput.setPrefRowCount(4);//4行
        taInput.setPrefColumnCount(20);//20列
        taInput.setWrapText(true);//允许自动换行

        Button button = new Button("验证字符串是否符合正则表达式");

        //用于输入的控件采用垂直排列
        VBox vInput = new VBox(20);
        //添加子节点
        vInput.getChildren().addAll(hRegex, lblInput, taInput, button);
        vInput.setPadding(new Insets(20.0));//设置边距
        vInput.setAlignment(Pos.CENTER);//对齐方式

        //列表显示验证结果
        ListView<String> lvPrint = new ListView<>();
        lvPrint.getItems().add("显示验证结果");

        //水平排列：左边输入，右边显示结果
        HBox hBox = new HBox();
        hBox.getChildren().addAll(vInput, lvPrint);

        //垂直排列的根节点
        VBox root = new VBox(20);//节点之间的垂直间距20
        //为根节点添加子节点
        root.getChildren().addAll(lblStudent, hBox);
        root.setPadding(new Insets(20.0));//设置根节点的边距
        root.setAlignment(Pos.TOP_CENTER);//根节点中各节点的对齐方式
        root.setStyle("-fx-font-size:20");//用CSS样式设置容器中所有节点的字体大小

        button.setOnAction(new EventHandler<ActionEvent>() {
            /**
             * 处理
             * （1）读取单行文本框中输入的正则表达式（提示：使用getText方法）
             * （2）读取多行文本框中输入的字符串---->strInput变量（提示：使用getText方法）
             * （3）用逗号拆分字符串strInput---->inputs数组
             * （4）清空ListView中已有的内容（提示：使用getItems().clear()）
             * （5）对数组inputs中的每个元素进行如下操作:如果内容不为空，则：①验证是否满足正则表达式，
             *          ②将当前元素及验证结果添加到ListView（提示：使用getItems().add()）
             * @param event 事件
             */
            @Override
            public void handle(ActionEvent event) {
                String stRegex = tfRegex.getText();//读取单行文本框中输入的正则表达式（提示：使用getText方法）
                String strInput = taInput.getText();//读取多行文本框中输入的字符串---->strInput变量（提示：使用getText方法）
                if(tfRegex == null | tfRegex.equals("")){
                    tfRegex.setText("缺少正则表达式，请输入！");
                }else {
                    assert strInput != null;
                    if(strInput == null | strInput.equals("")){
                        taInput.setText("缺少需要检验的字符串，请输入！");
                    }else{
                    //用逗号拆分字符串strInput---->inputs数组
                    String[] inputs = strInput.split("[,，]");
                    lvPrint.getItems().clear();//清空ListView中已有的内容（提示：使用getItems().clear()）
                        for (String input : inputs) {
                            if (input != null) {
                                boolean flag = input.matches(stRegex);
                                lvPrint.getItems().add(input + ":" + flag);
                            }
                        }
                }
                }
            }
        });
        return root;
    }
}
